/*!
 * @file
 * @brief 引脚控制相关方法
 */

#pragma once

/*-----------------------------------------------------------------------------
 * HEADER FILES
 *---------------------------------------------------------------------------*/
#include "gmi_status.h"
#include "gmi_type.h"

/*-----------------------------------------------------------------------------
 * TYPE DEFINITION
 *---------------------------------------------------------------------------*/
typedef pvoid gmi_gpio_port_t;    // GPIO端口
typedef uint16_t gmi_gpio_pin_t;  // GPIO引脚号

/**
 * @brief 电平参数
 * @note 适用于所有平台
 */
typedef enum gmi_pin_level_e
{
    HIGH_Z = -1,
    LOW_LEVEL,
    HIGH_LEVEL
} gmi_pin_level_t;

/**
 * @brief 引脚配置
 * @note 仅适用于stm32
 */
typedef struct gmi_gpio_st
{
    gmi_gpio_port_t port;  ///< port口
    gmi_gpio_pin_t pin;    ///< pin号
} gmi_gpio_t;

/**
 * @brief 引脚方向
 * @note 仅适用于stm32
 */
typedef enum gmi_pin_dir_e
{
    GMI_GPIO_OUTPUT = 0U,
    GMI_GPIO_INPUT
} gmi_pin_dir_t;

/*-----------------------------------------------------------------------------
 * FUNCTION DECLARATION
 *---------------------------------------------------------------------------*/

/**
 * @brief GPIO初始化
 * @param {GMI_PIN*} pin
 * @return 非0则异常
 * @note 需要提前声明 GMI_PIN 类型变量，使用地址传递参数
 */
GMI_STATUS gmi_pin_init(gmi_gpio_t* pin);

/**
 * @brief GPIO销毁
 * @param {GMI_PIN*} pin
 * @return {*}
 */
GMI_STATUS gmi_pin_deinit(gmi_gpio_t* pin);

/**
 * @brief 获取引脚电平
 * @param {gmi_gpio_t*} pin
 * @return {*}
 */
gmi_pin_level_t gmi_pin_get_level(gmi_gpio_t* pin);

/**
 * @brief 控制引脚电平
 * @param {gmi_gpio_t*} pin
 * @param {gmi_pin_level_t} level
 * @return {*}
 */
GMI_STATUS gmi_pin_set_level(gmi_gpio_t* pin, gmi_pin_level_t level);

/**
 * @brief 控制引脚方向
 * @param {gmi_gpio_t*} pin
 * @param {gmi_pin_dir_t} dir
 * @return {*}
 */
GMI_STATUS gmi_pin_set_dir(gmi_gpio_t* pin, gmi_pin_dir_t dir);